home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / Clean 1.2.4 / PowerMacInterface / quickdraw.icl < prev    next >
Text File  |  1997-01-06  |  16KB  |  600 lines

  1. implementation module quickdraw;
  2.  
  3. import StdInt, mac_types;
  4.  
  5. BlackColor:==33;
  6. WhiteColor:==30;
  7. RedColor:==205;
  8. GreenColor:==341;
  9. BlueColor:==409;
  10. CyanColor:==273;
  11. MagentaColor:== 137;
  12. YellowColor:== 69;
  13.  
  14. PatCopy :== 8;
  15. PatOr :== 9;
  16. PatXor :== 10;
  17. PatBic :== 11;
  18. NotPatCopy :== 12;
  19. NotPatOr :== 13;
  20. NotPatXor :== 14;
  21. NotPatBic :== 15;
  22. PatHilite :== 50;
  23.  
  24. White :== (0,0);
  25. Black :== (-1,-1);
  26. Gray :== (1437226410,1437226410);
  27. LtGray :== (-2011002846,-2011002846);
  28. DkGray :== (2011002845,2011002845);
  29.  
  30. Bold :== 1;
  31. Italic :== 2;
  32. Underline :== 4;
  33. Outline :== 8;
  34. Shadow :== 16;
  35. Condense :== 32;
  36. Extend :== 64;
  37.  
  38. SrcCopy :== 0;
  39. SrcOr :== 1;
  40. SrcXor :== 2;
  41. SrcBic :== 3;
  42.  
  43. ScrnHResAddress :== 260;
  44. ScrnVResAddress :== 258;
  45.  
  46. ::    GrafPtr :== Int;
  47. ::    PicHandle :== Int;
  48. ::    PolyHandle :== Int;
  49. ::    RGBColor :== (!Int,!Int,!Int);
  50.  
  51. //    GrafPort Routines
  52.  
  53. QSetPort :: !GrafPtr !Toolbox -> Toolbox;
  54. QSetPort port t = code (port=D0,t=U)(z=Z){
  55.     call    .SetPort
  56. };
  57.  
  58. QGetPort :: !Toolbox -> (!GrafPtr,!Toolbox);
  59. QGetPort t = code (t=R4O0D0U)(current_port=L,z=Z){
  60.     call    .GetPort
  61. };
  62.  
  63. QSetOrigin :: !Int !Int !Toolbox -> Toolbox;
  64. QSetOrigin h v t = code (h=D0,v=D1,t=U)(z=Z){
  65.     call    .SetOrigin
  66. };
  67.  
  68. QSetClip :: !RgnHandle !Toolbox -> Toolbox;
  69. QSetClip rgn t = code (rgn=D0,t=U)(z=Z){
  70.     call    .SetClip
  71. };
  72.  
  73. QGetClip :: !RgnHandle !Toolbox -> (!RgnHandle,!Toolbox);
  74. QGetClip rgn t = code (rgn=D0,t=U)(rgn`=A0,z=Z){
  75.     call    .GetClip
  76. };
  77.  
  78. QClipRect :: !Rect !Toolbox -> Toolbox;
  79. QClipRect (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  80.     call    .ClipRect
  81. };
  82.  
  83. //    Cursor-Handling Routines
  84.  
  85. QInitCursor :: !Toolbox -> Toolbox;
  86. QInitCursor t = code (t=U)(z=Z){
  87.     call    .InitCursor
  88. };
  89.  
  90. QSetCursor :: !Ptr !Toolbox -> Toolbox;
  91. QSetCursor crsr t = code (crsr=D0,t=U)(z=Z){
  92.     call    .SetCursor
  93. };
  94.  
  95. QHideCursor :: !Toolbox -> Toolbox;
  96. QHideCursor t = code (t=U)(z=Z){
  97.     call    .HideCursor
  98. };
  99.  
  100. QShowCursor :: !Toolbox -> Toolbox;
  101. QShowCursor t = code (t=U)(z=Z){
  102.     call    .ShowCursor
  103. };
  104.  
  105. QObscureCursor :: !Toolbox -> Toolbox;
  106. QObscureCursor t = code (t=U)(z=Z){
  107.     call    .ObscureCursor
  108. };
  109.  
  110. //    Pen and Line-Drawing Routines
  111.  
  112. QHidePen :: !Toolbox -> Toolbox;
  113. QHidePen t = code (t=U)(z=Z){
  114.     call    .HidePen
  115. };
  116.  
  117. QShowPen :: !Toolbox -> Toolbox;
  118. QShowPen t = code (t=U)(z=Z){
  119.     call    .ShowPen
  120. };
  121.  
  122. QGetPen :: !Toolbox -> (!Int,!Int,!Toolbox);
  123. QGetPen t = (x,y,t1);
  124. {
  125.     (y,x,t1)=QGetPen0 t;
  126.  
  127.     QGetPen0 :: !Toolbox -> (!Int,!Int,!Toolbox);
  128.     QGetPen0 t = code (t=R4O0D0U)(v=W,h=W,d=Z){
  129.         call    .GetPen
  130.     };
  131. }
  132.  
  133. QPenSize :: !Int !Int !Toolbox -> Toolbox;
  134. QPenSize width height t = code (width=D0,height=D1,t=U)(z=Z){
  135.     call    .PenSize
  136. };
  137.  
  138. QPenMode :: !Int !Toolbox -> Toolbox;
  139. QPenMode mode t = code (mode=D0,t=U)(z=Z){
  140.     call    .PenMode
  141. };
  142.  
  143. QPenPat :: !(!Int,!Int) !Toolbox -> Toolbox;
  144. QPenPat (pat1,pat2) t = code (pat2=L,pat1=L,t=O0D0U)(z=I8Z){ 
  145.     call    .PenPat
  146. };
  147.  
  148. QPenNormal :: !Toolbox -> Toolbox;
  149. QPenNormal t = code (t=U)(z=Z){
  150.     call    .PenNormal
  151. };
  152.  
  153. QMoveTo :: !Int !Int !Toolbox -> Toolbox;
  154. QMoveTo h v t = code (h=D0,v=D1,t=U)(z=Z){
  155.     call    .MoveTo
  156. };
  157.  
  158. QMove :: !Int !Int !Toolbox -> Toolbox;
  159. QMove dh dv t = code (dh=D0,dv=D1,t=U)(z=Z){
  160.     call    .Move
  161. };
  162.  
  163. QLineTo :: !Int !Int !Toolbox -> Toolbox;
  164. QLineTo h v t = code (h=D0,v=D1,t=U)(z=Z){
  165.     call    .LineTo
  166. };
  167.  
  168.  
  169. QLine :: !Int !Int !Toolbox -> Toolbox;
  170. QLine dh dv t = code (dh=D0,dv=D1,t=U)(z=Z){
  171.     call    .Line
  172. };
  173.  
  174. //    Text-Drawing Routines
  175.  
  176. QTextFont :: !Int !Toolbox -> Toolbox;
  177. QTextFont font t = code (font=D0,t=U)(z=Z){
  178.     call    .TextFont
  179. };
  180.  
  181. QTextFace :: !Int !Toolbox -> Toolbox;
  182. QTextFace face t = code (face=D0,t=U)(z=Z){
  183.     call    .TextFace
  184. };
  185.  
  186. QTextMode :: !Int !Toolbox -> Toolbox;
  187. QTextMode mode t = code (mode=D0,t=U)(z=Z){
  188.     call    .TextMode
  189. };
  190.  
  191. QTextSize :: !Int !Toolbox -> Toolbox;
  192. QTextSize size t = code (size=D0,t=U)(z=Z){
  193.     call    .TextSize
  194. };
  195.  
  196. QDrawChar :: !Char !Toolbox -> Toolbox;
  197. QDrawChar char t = code (char=D0,t=U)(z=Z){
  198.     call    .DrawChar
  199. };
  200.  
  201. QDrawString :: !{#Char} !Toolbox -> Toolbox;
  202. QDrawString s t = code (s=U,t=U)(z=Z){
  203.     instruction    0x38800000    |    li        r4,0
  204.     instruction    0x38770008    |    addi    r3,r23,8
  205.     instruction    0x80B70004    |    lwz        r5,4(r23)
  206.     call    .DrawText
  207. };
  208.  
  209. QCharWidth :: !Char !Toolbox -> (!Int,!Toolbox);
  210. QCharWidth char t = code (char=D0,t=U)(width=D0,z=Z){
  211.     call    .CharWidth
  212. };
  213.  
  214. QStringWidth :: !{#Char} !Toolbox -> (!Int,!Toolbox);
  215. QStringWidth s t = code (s=U,t=U)(width=D0,z=Z){
  216.     instruction    0x38800000    |    li        r4,0
  217.     instruction    0x38770008    |    addi    r3,r23,8
  218.     instruction    0x80B70004    |    lwz        r5,4(r23)
  219.     call    .TextWidth
  220. };
  221.  
  222. QGetFontInfo :: !Toolbox -> (!Int,!Int,!Int,!Int,!Toolbox);
  223. QGetFontInfo t = code (t=R8O0D0U)(ascent=W,descent=W,widMax=W,leading=W,z=Z){
  224.     call    .GetFontInfo
  225. };
  226.  
  227. //    Drawing in Color
  228.  
  229. QForeColor :: !Int !Toolbox -> Toolbox;
  230. QForeColor color t = code (color=D0,t=U)(z=Z){
  231.     call    .ForeColor
  232. };
  233.  
  234. QRGBBackColor :: !RGBColor !Toolbox -> Toolbox;
  235. QRGBBackColor (red,green,blue) t = code (blue=W,green=W,red=W,t=O0D0U)(z=I6Z){
  236.     call    .RGBBackColor
  237. };
  238.  
  239. QRGBForeColor :: !RGBColor !Toolbox -> Toolbox;
  240. QRGBForeColor (red,green,blue) t = code (blue=W,green=W,red=W,t=O0D0U)(z=I6Z){
  241.     call    .RGBForeColor
  242. };
  243.  
  244. QSetCPixel :: !Int !Int !RGBColor !Toolbox -> Toolbox;
  245. QSetCPixel h v (red,green,blue) t = code (blue=W,green=W,red=W,h=D0,v=D1,t=O0D2U)(z=I6Z){
  246.     call    .SetCPixel
  247. };
  248.  
  249. QBackColor :: !Int !Toolbox -> Toolbox;
  250. QBackColor color t = code (color=D0,t=U)(z=Z){
  251.     call    .BackColor
  252. };
  253.  
  254. //    Calculations with Rectangles
  255.  
  256. //    Graphic Operations on Rectangles
  257.  
  258. QFrameRect :: !Rect !Toolbox -> Toolbox;
  259. QFrameRect (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  260.     call    .FrameRect
  261. };
  262.  
  263. QPaintRect :: !Rect !Toolbox -> Toolbox;
  264. QPaintRect (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  265.     call    .PaintRect
  266. };
  267.  
  268. QEraseRect :: !Rect !Toolbox -> Toolbox;
  269. QEraseRect (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  270.     call    .EraseRect
  271. };
  272.  
  273. QInvertRect :: !Rect !Toolbox -> Toolbox;
  274. QInvertRect (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  275.     call    .InvertRect
  276. };
  277.  
  278. //    Graphic operations on Ovals
  279.  
  280. QFrameOval :: !Rect !Toolbox -> Toolbox;
  281. QFrameOval (left,top,right,bottom) t = code (right=W, bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  282.     call    .FrameOval
  283. };
  284.  
  285. QPaintOval :: !Rect !Toolbox -> Toolbox;
  286. QPaintOval (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  287.     call    .PaintOval
  288. };
  289.  
  290. QEraseOval :: !Rect !Toolbox -> Toolbox;
  291. QEraseOval (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  292.     call    .EraseOval
  293. };
  294.  
  295. QInvertOval :: !Rect !Toolbox -> Toolbox;
  296. QInvertOval (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=O0D0U)(z=I8Z){
  297.     call    .InvertOval
  298. };
  299.  
  300. //    Graphic Operations on Rounded-Corner Rectangles
  301.  
  302. QFrameRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  303. QFrameRoundRect (left,top,right,bottom) ovalWidth ovalHeight t
  304. = code (right=W,bottom=W,left=W,top=W,ovalWidth=O0D0D1,ovalHeight=D2,t=U)(z=I8Z){
  305.     call    .FrameRoundRect
  306. };
  307.  
  308. QPaintRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  309. QPaintRoundRect (left,top,right,bottom) ovalWidth ovalHeight t
  310. = code (right=W,bottom=W,left=W,top=W,ovalWidth=O0D0D1,ovalHeight=D2,t=U)(z=I8Z){
  311.     call    .PaintRoundRect
  312. };
  313.  
  314. QEraseRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  315. QEraseRoundRect (left,top,right,bottom) ovalWidth ovalHeight t
  316. = code (right=W,bottom=W,left=W,top=W,ovalWidth=O0D0D1,ovalHeight=D2,t=U)(z=I8Z){
  317.     call    .EraseRoundRect
  318. };
  319.  
  320. QInvertRoundRect :: !Rect !Int !Int !Toolbox -> Toolbox;
  321. QInvertRoundRect (left,top,right,bottom) ovalWidth ovalHeight t
  322. = code (right=W,bottom=W,left=W,top=W,ovalWidth=O0D0D1,ovalHeight=D2,t=U)(z=I8Z){
  323.     call    .InvertRoundRect
  324. };
  325.  
  326. //    Graphic Operations on Arcs and Wedges
  327.  
  328. QFrameArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  329. QFrameArc (left,top,right,bottom) startAngle arcAngle t
  330. = code (right=W,bottom=W,left=W,top=W,startAngle=O0D0D1,arcAngle=D2,t=U)(z=I8Z){
  331.     call    .FrameArc
  332. };
  333.  
  334. QPaintArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  335. QPaintArc (left,top,right,bottom) startAngle arcAngle t
  336. = code (right=W,bottom=W,left=W,top=W,startAngle=O0D0D1,arcAngle=D2,t=U)(z=I8Z){
  337.     call    .PaintArc
  338. };
  339.  
  340. QEraseArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  341. QEraseArc (left,top,right,bottom) startAngle arcAngle t
  342. = code (right=W,bottom=W,left=W,top=W,startAngle=O0D0D1,arcAngle=D2,t=U)(z=I8Z){
  343.     call    .EraseArc
  344. };
  345.  
  346. QInvertArc :: !Rect !Int !Int !Toolbox -> Toolbox;
  347. QInvertArc (left,top,right,bottom) startAngle arcAngle t
  348. = code (right=W,bottom=W,left=W,top=W,startAngle=O0D0D1,arcAngle=D2,t=U)(z=I8Z){
  349.     call    .InvertArc
  350. };
  351.  
  352. //    Calculations with Regions
  353.  
  354. QNewRgn :: !Toolbox -> (!RgnHandle, !Toolbox);
  355. QNewRgn t = code (t=U)(region=D0,z=Z){
  356.     call    .NewRgn
  357. };
  358.  
  359. QOpenRgn :: !RgnHandle !Toolbox -> Toolbox;
  360. QOpenRgn region t = code (region=U,t=U)(z=Z){
  361.     call    .OpenRgn
  362. };
  363.  
  364. QCloseRgn :: !RgnHandle !Toolbox -> Toolbox;
  365. QCloseRgn region t = code (region=D0,t=U)(z=Z){
  366.     call    .CloseRgn
  367. };
  368.  
  369. QDisposeRgn :: !RgnHandle !Toolbox -> Toolbox;
  370. QDisposeRgn region t = code (region=D0,t=u)(z=Z){
  371.     call    .DisposeRgn
  372. };
  373.  
  374. QRectRgn :: !RgnHandle !Rect !Toolbox -> Toolbox;
  375. QRectRgn rgn (left,top,right,bottom) t = code (right=W, bottom=W, left=W, top=W,rgn=D0,t=O0D1U)(z=I8Z){
  376.     call    .RectRgn
  377. };
  378.  
  379. QSectRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  380. QSectRgn srcRgnA srcRgnB dstRgn t = code (srcRgnA=D0,srcRgnB=D1,dstRgn=D2,t=U)(srcRgn`=A0,z=Z){
  381.     call    .SectRgn
  382. };
  383.  
  384. QUnionRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  385. QUnionRgn srcRgnA srcRgnB dstRgn t = code (srcRgnA=D0,srcRgnB=D1,dstRgn=D2,t=U)(srcRgn`=A0,z=Z){
  386.     call    .UnionRgn
  387. };
  388.  
  389. QDiffRgn :: !RgnHandle !RgnHandle !RgnHandle !Toolbox -> (!RgnHandle, !Toolbox);
  390. QDiffRgn srcRgnA srcRgnB dstRgn t = code (srcRgnA=D0,srcRgnB=D1,dstRgn=D2,t=U)(srcRgn`=A0,z=Z){
  391.     call    .DiffRgn
  392. };
  393.  
  394. QPtInRgn :: !(!Int,!Int) !RgnHandle !Toolbox -> (!Bool,!Toolbox);
  395. QPtInRgn (x,y) rgn t = code (x=D0,y=A0,rgn=D1,t=U)(b=D0,z=Z){
  396.     instruction 0x52E3801E    |    rlwimi    r3,r23,16,0,15
  397.     call    .PtInRgn
  398.     instruction    0x70630001    |    andi.    r3,r3,1
  399.     instruction    0x7C6300D0    |    neg        r3,r3
  400. };
  401.  
  402. QEmptyRgn :: !RgnHandle !Toolbox -> (!Bool, !Toolbox);
  403. QEmptyRgn region t = code (region=D0,t=U)(empty_region=D0,z=Z){
  404.     call    .EmptyRgn
  405.     instruction    0x70630001    |    andi.    r3,r3,1
  406.     instruction    0x7C6300D0    |    neg        r3,r3
  407. };
  408.  
  409. //    Graphic Operations on Regions
  410.  
  411. QFrameRgn :: !RgnHandle !Toolbox -> Toolbox;
  412. QFrameRgn region t = code (region=D0,t=U)(z=Z){
  413.     call    .FrameRgn
  414. };
  415.  
  416. QPaintRgn :: !RgnHandle !Toolbox -> Toolbox;
  417. QPaintRgn region t = code (region=D0,t=U)(z=Z){
  418.     call    .PaintRgn
  419. };
  420.  
  421. QEraseRgn :: !RgnHandle !Toolbox -> Toolbox;
  422. QEraseRgn region t = code (region=D0,t=U)(z=Z){
  423.     call    .EraseRgn
  424. };
  425.  
  426. QInvertRgn :: !RgnHandle !Toolbox -> Toolbox;
  427. QInvertRgn region t = code (region=D0,t=U)(z=Z){
  428.     call    .InvertRgn
  429. };
  430.  
  431. //    Bit Transfer Operations
  432.  
  433. QScrollRect :: !Rect !Int !Int !RgnHandle !Toolbox -> Toolbox;
  434. QScrollRect (left,top,right,bottom) dh dv updateRgn t
  435. = code (right=W,bottom=W,left=W,top=W,dh=O0D0D1,dv=D2,updateRgn=D3,t=U)(z=I8Z){
  436.     call    .ScrollRect
  437. };
  438.  
  439. CopyBits :: !Ptr !Int !Rect !Ptr !Int !Rect !Rect !Rect !Int !RgnHandle !Toolbox -> Toolbox;
  440. CopyBits
  441.     srcBaseAddr srcRowBytes (srcBoundsLeft,srcBoundsTop,srcBoundsRight,srcBoundsBottom)
  442.     destBaseAddr destRowBytes (destBoundsLeft,destBoundsTop,destBoundsRight,destBoundsBottom)
  443.     (srcLeft,srcTop,srcRight,srcBottom) (destLeft,destTop,destRight,destBottom)
  444.     mode maskRgn t =
  445. code (
  446.     srcBoundsRight=W, srcBoundsBottom=W, srcBoundsLeft=W, srcBoundsTop=W, srcRowBytes=W, srcBaseAddr=L,
  447.     destBoundsRight=W, destBoundsBottom=W, destBoundsLeft=W, destBoundsTop=W, destRowBytes=W, destBaseAddr=L,
  448.     srcRight=W, srcBottom=W, srcLeft=W, srcTop=W,
  449.     destRight=W, destBottom=W, destLeft=W, destTop=W,
  450.     mode=D4, maskRgn=D5, t=O30D0O16D1O8D2O0D3U)(z=I44Z)
  451. {
  452.     call    .CopyBits
  453. };
  454.  
  455. //    Pictures
  456.  
  457. QOpenPicture :: !Rect !Toolbox -> (!PicHandle, !Toolbox);
  458. QOpenPicture (left,top,right,bottom) t = code (right=W,bottom=W,left=W,top=W,t=R4O4D0D1)(pic_handle=L,z=I8Z){
  459.     call    .OpenPicture
  460. };
  461.  
  462. QClosePicture :: !PicHandle !Toolbox -> Toolbox;
  463. QClosePicture picture t = code (picture=U,t=U)(z=Z){
  464.     call    .ClosePicture
  465. };
  466.  
  467. QDrawPicture :: !PicHandle !Rect !Toolbox -> Toolbox;
  468. QDrawPicture picture (left,top,right,bottom) c = code (right=W,bottom=W,left=W,top=W,picture=D0,c=O4D1U)(z=I8Z){
  469.     call    .DrawPicture
  470. };
  471.  
  472. QKillPicture :: !PicHandle !Toolbox -> Toolbox;
  473. QKillPicture picture t = code (picture=D0,t=U)(z=Z){
  474.     call    .KillPicture
  475. };
  476.  
  477. //    Calculations with Polygons
  478.  
  479. QOpenPoly :: !Toolbox -> (!PolyHandle, !Toolbox);
  480. QOpenPoly t = code (t=D0)(poly=D0,z=Z){
  481.     call    .OpenPoly
  482. };
  483.  
  484. QClosePoly :: !PolyHandle !Toolbox -> Toolbox;
  485. QClosePoly poly t = code (poly=U,t=U)(z=Z){
  486.     call    .ClosePoly
  487. };
  488.  
  489. QKillPoly :: !PolyHandle !Toolbox -> Toolbox;
  490. QKillPoly poly t = code (poly=D0,t=U)(z=Z){
  491.     call    .KillPoly
  492. };
  493.  
  494. QOffsetPoly :: !PolyHandle !Int !Int !Toolbox -> Toolbox;
  495. QOffsetPoly poly dh dv t = code (poly=D0,dh=D1,dv=D2,t=U)(z=Z){
  496.     call    .OffsetPoly
  497. };
  498.  
  499. QOffsetRgn :: !RgnHandle !Int !Int !Toolbox -> Toolbox;
  500. QOffsetRgn region dh dv t = code (region=D0,dh=D1,dv=D2,t=U)(z=Z){
  501.     call    .OffsetRgn
  502. };
  503.  
  504. //    Graphic Operations on Polygons
  505.  
  506. QFramePoly :: !PolyHandle !Toolbox -> Toolbox;
  507. QFramePoly poly t = code (poly=D0,t=U)(z=Z){
  508.     call    .FramePoly
  509. };
  510.  
  511. QPaintPoly :: !PolyHandle !Toolbox -> Toolbox;
  512. QPaintPoly poly t = code (poly=D0,t=U)(z=Z){
  513.     call    .PaintPoly
  514. };
  515.  
  516. QErasePoly :: !PolyHandle !Toolbox -> Toolbox;
  517. QErasePoly poly t = code (poly=D0,t=U)(z=Z){
  518.     call    .ErasePoly
  519. };
  520.  
  521. QInvertPoly :: !PolyHandle !Toolbox -> Toolbox;
  522. QInvertPoly poly t = code (poly=D0,t=U)(z=Z){
  523.     call    .InvertPoly
  524. };
  525.  
  526. //    Calculations with Points
  527.  
  528. //    Miscellaneous Routines
  529.  
  530. QLocalToGlobal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  531. QLocalToGlobal h v t = (nh,nv,z);
  532. {
  533.     (nv,nh,z)= QLocalToGlobal h v t;
  534.  
  535.     QLocalToGlobal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  536.     QLocalToGlobal h v t = code (h=W,v=W,t=O0D0U)(nvr=W,nhr=W,zr=Z){
  537.         call    .LocalToGlobal
  538.     };
  539. }
  540.  
  541. QGlobalToLocal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  542. QGlobalToLocal h v t = (nh,nv,z);
  543. {
  544.     (nv,nh,z)= QGlobalToLocal h v t;
  545.     
  546.     QGlobalToLocal :: !Int !Int !Toolbox -> (!Int,!Int,!Toolbox);
  547.     QGlobalToLocal h v t = code (h=W,v=W,t=O0D0U)(nvr=W,nhr=W,zr=Z){
  548.         call    .GlobalToLocal
  549.     };
  550. }
  551.  
  552. QScreenRect :: !Toolbox -> (!Int,!Int,!Int,!Int,!Toolbox);
  553. QScreenRect tb = (left, top, right, bottom, tb);
  554.     {
  555.         (left,top,right,bottom) = QScreenRect1;
  556.     };
  557.  
  558. QScreenRect1 :: (!Int,!Int,!Int,!Int);
  559. QScreenRect1 = code ()(left=A0,top=A0,right=A0,bottom=A0){
  560.     call    .qdglobals
  561.     instruction 0xAB430056    | lha    r26,86(r3)
  562.     instruction 0xAB630058    | lha    r27,88(r3)
  563.     instruction 0xAB03005A    | lha    r24,90(r3)
  564.     instruction 0xAB23005C    | lha    r25,92(r3)
  565. };
  566.  
  567. HasColorQD :: !Toolbox -> (!Bool,!Toolbox);
  568. HasColorQD tb = (True,tb);
  569.  
  570. //    Customizing Quickdraw Operations
  571.  
  572. QStdTxMeas :: !Int !{#Char} !(!Int,!Int) !(!Int,!Int) !(!Int,!Int,!Int,!Int) !Toolbox
  573.     -> (!Int,!(!Int,!Int),!(!Int,!Int),!(!Int,!Int,!Int,!Int),!Toolbox);
  574. QStdTxMeas byteCount s (srcnumerh,srcnumerv) (srcdenomh,srcdenomv) (srcascent,srcdescent,srcwidMax,srcleading) tb
  575. = (width,(destnumerh,destnumerv),(destdenomh,destdenomv),(destascent,destdescent,destwidMax,destleading),tb1)
  576. where {
  577.     (width,numer,denom,ascdesc,widlead,tb1)
  578.         = QStdTxMeas` byteCount s srcnumerv srcnumerh srcdenomv srcdenomh srcascent srcdescent srcwidMax srcleading tb;
  579.     (destnumerh,destnumerv)    = longTo2Word numer;
  580.     (destdenomh,destdenomv)    = longTo2Word denom;
  581.     (destdescent,destascent)= longTo2Word ascdesc;
  582.     (destleading,destwidMax)= longTo2Word widlead;
  583. };
  584.  
  585. QStdTxMeas` :: !Int !{#Char} !Int !Int !Int !Int !Int !Int !Int !Int !Toolbox
  586.     -> (!Int,!Int,!Int,!Int,!Int,!Toolbox);
  587. QStdTxMeas` byteCount s srcnumerv srcnumerh srcdenomv srcdenomh srcascent srcdescent srcwidMax srcleading tb
  588. = code    (srcleading=W,srcwidMax=W,srcdescent=W,srcascent=W,srcdenomh=W,srcdenomv=W,srcnumerh=W,srcnumerv=W,byteCount=D0,s=U,tb=O0D2O4D3O16D4U)
  589.         (width=D0,numer=L,denom=L,ascdesc=L,widlead=L,z=Z){
  590.     instruction    0x38970008        |    addi    r4,r23,8
  591.     call    .StdTxMeas
  592. };
  593.  
  594. longTo2Word :: !Int -> (!Int,!Int);
  595. longTo2Word long = (word1,word2);
  596. where {
  597.     word1    = (long<<16)>>16;
  598.     word2    = long>>16;
  599. };
  600.